package com.example.exceldemo.service;

import com.example.exceldemo.model.ParsedExcelData;
import com.example.exceldemo.model.ParsedExcelDataEntity;
import com.example.exceldemo.model.ReqInfoDTO;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * Excel解析结果缓存服务接口
 * 提供Excel解析结果的缓存和检索功能
 */
public interface ParsedExcelDataService {

    /**
     * 保存Excel解析结果
     * @param filePath 文件路径（仅用于提取文件名）
     * @param dataJson 解析结果JSON字符串
     * @param expireDays 过期天数，过期后将自动清理
     * @return 保存的ParsedExcelData对象
     */
    ParsedExcelData saveExcelData(String filePath, String dataJson, int expireDays);

    /**
     * 保存Excel解析结果（仅使用哈希值和文件名，不保存实际文件）
     * @param fileHash 文件内容哈希值
     * @param originalFilename 原始文件名
     * @param dataJson 解析结果JSON字符串
     * @param expireDays 过期天数，过期后将自动清理
     * @return 保存的ParsedExcelData对象
     */
    ParsedExcelData saveExcelDataWithHash(String fileHash, String originalFilename, String dataJson, int expireDays);

    /**
     * 根据文件获取解析结果
     * 如果文件有缓存且未过期，则返回缓存结果
     * @param file Excel文件
     * @return 解析结果JSON字符串，如果没有缓存则返回空
     */
    Optional<String> getExcelDataByFile(File file);

    /**
     * 根据文件路径获取解析结果
     * 如果文件有缓存且未过期，则返回缓存结果
     * @param filePath 文件路径（仅用于提取文件名和计算哈希）
     * @return 解析结果JSON字符串，如果没有缓存则返回空
     */
    Optional<String> getExcelDataByPath(String filePath);

    /**
     * 根据原始文件名获取解析结果
     * 如果有多个结果，返回最新的一个
     * @param originalFilename 原始文件名
     * @return 解析结果JSON字符串，如果没有缓存则返回空
     */
    Optional<String> getExcelDataByOriginalFilename(String originalFilename);



    /**
     * 更新最后访问时间
     * @param id 缓存记录ID
     * @return 是否更新成功
     */
    boolean updateLastAccessTime(Long id, LocalDateTime lastAccessTime);

    /**
     * 清理过期数据
     * @return 清理的记录数
     */
    int cleanExpiredData();

    /**
     * 获取文件的哈希值
     * @param file 文件
     * @return 哈希值
     */
    String getFileHash(File file);

    /**
     * 获取字节数组的哈希值
     * @param bytes 字节数组
     * @return 哈希值
     */
    String getFileHash(byte[] bytes);

    /**
     * 上传并解析Excel文件，存储到数据库
     *
     * @param file Excel文件
     * @return 文件哈希值和解析后的数据
     */
    ParsedExcelResult saveExcelData(MultipartFile file);

    /**
     * 根据文件哈希值获取解析后的数据
     *
     * @param fileHash 文件哈希值
     * @return 解析后的数据
     */
    List<ReqInfoDTO> getExcelDataByHash(String fileHash);

    /**
     * 检查文件是否已解析并缓存
     *
     * @param fileHash 文件哈希值
     * @return 是否已缓存
     */
    boolean isExcelDataCached(String fileHash);

    /**
     * 计算文件的哈希值
     *
     * @param file 文件
     * @return 哈希值
     */
    String calculateFileHash(MultipartFile file);

    /**
     * 结果封装类
     */
    class ParsedExcelResult {
        private String fileHash;
        private List<ReqInfoDTO> reqInfoList;
        
        public ParsedExcelResult(String fileHash, List<ReqInfoDTO> reqInfoList) {
            this.fileHash = fileHash;
            this.reqInfoList = reqInfoList;
        }
        
        public String getFileHash() {
            return fileHash;
        }
        
        public List<ReqInfoDTO> getReqInfoList() {
            return reqInfoList;
        }
    }
} 